import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.*;

/**
 * clase Jugador
 * 
 * @author rolando delgado salcedo
 * @version version 1
 */
public class Jugador extends Actor
{
    /**
     * Act - do whatever the Jugador wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     * 
     */
    private int dir=0;//variable direccion
    private GreenfootImage img;//variable de tipo imagen
    private Color color=new Color(0,0,0);// objeto de tipo color
    private int x,y;//coordenadas en x y
    private boolean band=false;//bandera
    private boolean bandComida=false;//bandera para la comida
    private int cont=0;//variable auxiliar de comida
    /**
     * metodo actuar que mueve el jugador
     * checa si encontro comida y encontro malo
     * checa si ganaste y guarda el progreso
     */
    public void act() 
    {
        World mundo = getWorld();
        if(!band)
        {
            x=super.getX();
            y=super.getY();
            band=true;
        }
        if(Greenfoot.isKeyDown("right"))
        {
            if(dir==1)
                turn(180);
            if(dir==3)
                turn(90);
            if(dir==2)
                turn(270);
            dir=0;
            if(!eslimite())
                move(1);
            else
                setLocation(getX()-1,getY());
        }
        if(Greenfoot.isKeyDown("left"))
        {
            if(dir==0)
                turn(180);
            if(dir==2)
                turn(90);
            if(dir==3)
                turn(270);
            if(!eslimite())
                move(1);
            else
                setLocation(getX()+1,getY());
            dir=1;
            
        }
        if(Greenfoot.isKeyDown("down"))
        {
            if(dir==3)
                turn(180);
            if(dir==0)
                turn(90);
            if(dir==1)
                turn(270);
            dir=2;
            if(!eslimite())
                move(1);
            else
                setLocation(getX(),getY()-1);
        }
        if(Greenfoot.isKeyDown("up"))
        {
            if(dir==2)
                turn(180);
            if(dir==1)
                turn(90);
            if(dir==0)
                turn(270);
            if(!eslimite())
                move(1);
            else
                setLocation(getX(),getY()+1);
            dir=3;
        }
        if(encontroComida())
            eliminaComida();
        if(ganaste()&&bandComida)
        {
            ((IrritanteWorld)mundo).subeNivel(); 
        }
        if(encontroMaloso())
        {
          this.setLocation(x,y);  

          ((IrritanteWorld)mundo).restaVidas();
        }
        if(guarda())
        {
            x=super.getX();
            y=super.getY();
        }
    }    
    /**
     * metodo que checa si es limite
     * @return regresa si es limite
     */
    public boolean eslimite()
    {
        int x,y;
        boolean res=false;
        img=super.getImage();
        y=getY()-img.getHeight()/2;
        x=getX()-img.getWidth()/2;
        World mundo=getWorld();
        if(mundo.getColorAt(getX(),getY()).equals(color))
            res=true;
        return(res);
    }
    /**
     * metodo que checa si encontro comida
     * @return regresa si encontro comida
     */
    public boolean encontroComida()
    {
        boolean res=false;
        Actor food=getOneIntersectingObject(Food.class);
        if(food!=null){
        cont++;    
        res=true;}
        return(res);
    }
    /**
     * metodo que checa si encontro un malo o obstaculo
     * @return regresa si encontro un malo
     */
     public boolean encontroMaloso()
    {
        boolean res=false;
        Actor food=getOneIntersectingObject(Obstaculo.class);
        if(food!=null)
        res=true;
        return(res);
    }
    /**
     * metodo que elimina comida
     */
    public void eliminaComida()
    {
        World mundo=getWorld();
        bandComida=true;
        Actor food=getOneIntersectingObject(Food.class);
        mundo.removeObject(food);
    }
    /**
     * metodo que checa si ganaste
     * @return regresa si ganaste
     */
    public boolean ganaste()
    {
        World mundo=getWorld();
        Color col=new Color(82,191,179);
        boolean res=false;
        if(((IrritanteWorld)mundo).dameNivel()==1)
          bandComida=true;
        if(((IrritanteWorld)mundo).dameNivel()==3&&cont==3)
            bandComida=true;
        if(getWorld().getColorAt(getX(),getY()).equals(col))
            res=true;
        return(res);
    }
    /**
     * metodo que checa si se encuentra el jugador en un punto que guarda el proceso
     * @return regresa un valor si esta en un lugar donde deba guardar
     */
    public boolean guarda()
    {
        World mundo=getWorld();
        Color col=new Color(0,255,255);
        boolean res=false;
        if(getWorld().getColorAt(getX(),getY()).equals(col))
            res=true;
        return(res);
    }
}
